package com.workingpub.commons.jdbc;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;

import com.workingpub.commons.utils.Page;

/**
 * 类Mybaties动态SQL查询，扩展分页和结果映射
 * 
 * @author taoping
 * 
 */
public interface SqlClientManager {

	JdbcManager getJdbcManager();

	/**
	 * 单一参数查询，返回结果映射为类型 E，可按JPA注解或对象属性进行映射
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            单一对象参数，因为自定义对象类型而非Java简单类型
	 * @param type
	 * @return
	 */
	<E extends Object> E queryForObject(String sqlId, Object parameter, Class<E> type);

	/**
	 * 多参数查询，返回结果映射为类型 E，可按JPA注解或对象属性进行映射
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            参数集合
	 * @param type
	 * @return
	 */
	<E extends Object> E queryForObject(String sqlId, SqlParameters parameter, Class<E> type);

	<E extends Object> E queryForObject(String sqlId, SqlParameters parameter, RowMapper<E> mapper);

	String queryForString(String sqlId, SqlParameters parameter);

	Integer queryForInteger(String sqlId, SqlParameters parameter);

	Long queryForLong(String sqlId, SqlParameters parameter);

	Date queryForDate(String sqlId, SqlParameters parameter);

	BigDecimal queryForBigDecimal(String sqlId, SqlParameters parameter);

	/**
	 * 单一参数查询，返回结果映射为类型 E，可按JPA注解或对象属性进行映射
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            单一对象参数，因为自定义对象类型而非Java简单类型
	 * @param type
	 * @return
	 */
	<E extends Object> List<E> queryForList(String sqlId, Object parameter, Class<E> type);

	/**
	 * 多参数查询，返回结果映射为类型 E，可按JPA注解或对象属性进行映射
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            参数集合
	 * @param type
	 * @return
	 */
	<E extends Object> List<E> queryForList(String sqlId, SqlParameters parameter, Class<E> type);

	<E extends Object> List<E> queryForList(String sqlId, SqlParameters parameter, RowMapper<E> mapper);

	/**
	 * 单一参数查询，返回结果以Map形式组装
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            单一对象参数，因为自定义对象类型而非Java简单类型
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	List<Map> queryForMap(String sqlId, Object parameter);

	/**
	 * 多参数查询，返回结果以Map形式组装
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            参数集合
	 * @return
	 */
	@SuppressWarnings("rawtypes")
	List<Map> queryForMap(String sqlId, SqlParameters parameter);

	/**
	 * 单一参数分页查询
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            单一对象参数，因为自定义对象类型而非Java简单类型
	 * @param type
	 * @param pageNumber
	 *            页码
	 * @param pageSize
	 *            每页数据量
	 * @return
	 */
	<E extends Object> Page<E> queryForPage(String sqlId, Object parameter, Class<E> type, int pageNumber,
			int pageSize);

	/**
	 * 多参数分页查询
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            参数集合
	 * @param type
	 * @param pageNumber
	 *            页码
	 * @param pageSize
	 *            每页数据量
	 * @return
	 */
	<E extends Object> Page<E> queryForPage(String sqlId, SqlParameters parameter, Class<E> type, int pageNumber,
			int pageSize);

	<E extends Object> Page<E> queryForPage(String sqlId, SqlParameters parameter, RowMapper<E> mapper, int pageNumber,
			int pageSize);

	/**
	 * 单一参数分页查询
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param countSqlId
	 *            用于查询总数的SqlMapping Id
	 * @param parameter
	 *            单一对象参数，因为自定义对象类型而非Java简单类型
	 * @param type
	 * @param pageNumber
	 *            页码
	 * @param pageSize
	 *            每页数据量
	 * @return
	 */
	<E extends Object> Page<E> queryForPage(String sqlId, String countSqlId, Object parameter, Class<E> type,
			int pageNumber, int pageSize);

	/**
	 * 多参数分页查询
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param countSqlId
	 *            用于查询总数的SqlMapping Id
	 * @param parameter
	 *            参数集合
	 * @param type
	 * @param pageNumber
	 *            页码
	 * @param pageSize
	 *            每页数据量
	 * @return
	 */
	<E extends Object> Page<E> queryForPage(String sqlId, String countSqlId, SqlParameters parameter, Class<E> type,
			int pageNumber, int pageSize);

	<E extends Object> Page<E> queryForPage(String sqlId, String countSqlId, SqlParameters parameter,
			RowMapper<E> mapper, int pageNumber, int pageSize);

	/**
	 * 单一参数传递，执行insert, update, delete
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            单一对象参数，因为自定义对象类型而非Java简单类型
	 * @return
	 */
	int update(String sqlId, Object parameter);

	/**
	 * 多参数传递，执行insert, update, delete
	 * 
	 * @param sqlId
	 *            对应XML配置文件中相应SqlMapping Id
	 * @param parameter
	 *            参数集合
	 * @return
	 */
	int update(String sqlId, SqlParameters parameter);

	/**
	 * 获取当前传入sequence的下一个有效值，此方法只适用于oracle数据库
	 * 
	 * @param sequece
	 *            oracle sequence
	 * @return 传入sequence的当前值
	 */
	Long getNextSequence(String sequece);
}
